/**
 * 应用主进程入口文件
 */
import 'reflect-metadata'
import { app, BrowserWindow } from 'electron'
import { electronApp, optimizer } from '@electron-toolkit/utils'
import { setupIPC } from './ipc/index'
import { createSplashWindow } from './utils/windowManager'
import path from 'path'
import { initDatabase, verifyDatabaseEncryption } from './database/index'
import { getDataSource, getDatabaseStats } from './database/connection'
// import { EncryptionTester } from './test'
import { log } from './services/logger'

// 设置模块解析路径
const mainPath = path.join(__dirname, '..')
module.paths.push(mainPath)

// 应用准备好时
app.whenReady().then(async () => {
  log.info('应用准备就绪', {
    cwd: process.cwd(),
    appPath: app.getAppPath(),
    dirname: __dirname,
    modulePaths: module.paths
  })
  
  // 设置应用用户模型ID
  electronApp.setAppUserModelId('com.electron')

  // 设置默认的开发者工具快捷键
  app.on('browser-window-created', (_, window) => {
    optimizer.watchWindowShortcuts(window)
  })

  try {
    // 初始化数据库
    log.info('初始化数据库...')
    const dbStartTime = performance.now()
    await initDatabase()
    const dbEndTime = performance.now()
    log.performance('数据库初始化', dbEndTime - dbStartTime)
    log.info('数据库初始化成功')

    // 验证数据库加密状态
    const isEncrypted = await verifyDatabaseEncryption()
    log.info('数据库加密状态验证完成', { encrypted: isEncrypted })

    // 设置IPC处理程序
    log.info('设置IPC处理程序')
    setupIPC()

    // 创建启动窗口
    log.info('创建启动窗口')
    const mainWindow = createSplashWindow()

    // 等待窗口加载完成后验证数据库加密
    mainWindow.webContents.on('did-finish-load', async () => {
      log.info('主窗口加载完成，开始验证数据库加密...')
      const encryptionStatus = await verifyDatabaseEncryption()
      log.info('最终数据库加密状态验证完成', { encrypted: encryptionStatus })

      // 暂时跳过TypeORM数据源初始化，使用现有的加密数据库系统
      // TODO: 配置TypeORM使用better-sqlite3-multiple-ciphers
      log.info('使用现有的加密数据库系统，跳过TypeORM初始化')
    })
  } catch (error) {
    const errorMessage = error instanceof Error ? error.message : String(error)
    const errorStack = error instanceof Error ? error.stack : undefined
    log.error('应用初始化失败', { error: errorMessage, stack: errorStack })
  }

  // 处理macOS激活事件
  app.on('activate', function () {
    // 在macOS上，当点击dock图标且没有其他窗口打开时，重新创建窗口
    if (BrowserWindow.getAllWindows().length === 0) {
      createSplashWindow()
    }
  })
})

// 当所有窗口关闭时退出应用
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
  }
}) 